home *** CD-ROM | disk | FTP | other *** search
- <?xml version="1.0"?>
-
- <!--
- Copyright 2003-2005 The Apache Software Foundation or its licensors, as
- applicable.
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
- <xsl:stylesheet version="1.0"
- xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
- xmlns="http://www.w3.org/1999/xhtml">
-
-
- <!-- ==================================================================== -->
- <!-- Ordinary HTML that must be converted to latex -->
- <!-- ==================================================================== -->
-
- <xsl:template match="ul">
- <xsl:text>\begin{itemize}
- </xsl:text>
- <xsl:apply-templates/>
- <xsl:text>\end{itemize}
- </xsl:text>
- </xsl:template>
-
- <xsl:template match="ol">
- <xsl:text>\begin{enumerate}
- </xsl:text>
- <xsl:apply-templates/>
- <xsl:text>\end{enumerate}
- </xsl:text>
- </xsl:template>
-
- <xsl:template match="li">
- <xsl:text>\item </xsl:text>
- <xsl:apply-templates/>
- <xsl:text>
- </xsl:text>
- </xsl:template>
-
- <xsl:template match="dl">
- <xsl:text>\begin{description}
- </xsl:text>
- <xsl:apply-templates/>
- <xsl:text>\end{description}
- </xsl:text>
- </xsl:template>
-
- <xsl:template match="dt">
- <xsl:text>\item[</xsl:text><xsl:apply-templates/>
- <xsl:text>] </xsl:text>
- </xsl:template>
-
- <xsl:template match="dd">
- <xsl:apply-templates/>
- </xsl:template>
-
- <!-- Latex doesn't like successive line breaks, so replace any
- sequence of two or more br separated only by white-space with
- one line break followed by smallskips. -->
- <xsl:template match="br">
- <xsl:choose>
- <xsl:when test="name(preceding-sibling::node()[1])='br' or name(preceding-sibling::node()[1])='indent'">
- <xsl:text>\smallskip </xsl:text>
- </xsl:when>
- <xsl:when test="name(preceding-sibling::node()[2])='br' or name(preceding-sibling::node()[2])='indent'">
- <xsl:choose>
- <xsl:when test="normalize-space(preceding-sibling::node()[1])=''">
- <xsl:text>\smallskip </xsl:text>
- </xsl:when>
- <xsl:otherwise>
- <!-- Don't put a line break if we are the last thing -->
- <xsl:if test="not(position()=last()) and not(position()=last()-1 and normalize-space(following-sibling::node()[1])='')">
- <xsl:text>\\ </xsl:text>
- </xsl:if>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:when>
- <xsl:otherwise>
- <!-- Don't put a line break if we are the last thing -->
- <xsl:if test="not(position()=last()) and not(position()=last()-1 and normalize-space(following-sibling::node()[1])='')">
- <xsl:text>\\ </xsl:text>
- </xsl:if>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:template>
-
- <xsl:template match="p">
- <xsl:apply-templates/>
- <xsl:text>\par
- </xsl:text>
- </xsl:template>
-
- <xsl:template match="code">
- <xsl:text>\texttt{</xsl:text>
- <xsl:apply-templates/>
- <xsl:text>}</xsl:text>
- </xsl:template>
-
- <xsl:template match="strong">
- <xsl:text>\textbf{</xsl:text>
- <xsl:apply-templates/>
- <xsl:text>}</xsl:text>
- </xsl:template>
-
- <xsl:template match="em">
- <xsl:text>\textit{</xsl:text>
- <xsl:apply-templates/>
- <xsl:text>}</xsl:text>
- </xsl:template>
-
- <!-- Value-of used here explicitly because we don't wan't latex-escaping
- performed. Of course, this will conflict with html where some tags are
- interpreted in pre -->
- <xsl:template match="pre">
- <xsl:text>\begin{verbatim}
- </xsl:text>
- <xsl:value-of select="."/>
- <xsl:text>\end{verbatim}
- </xsl:text>
- </xsl:template>
-
- <xsl:template match="blockquote">
- <xsl:text>\begin{quotation}
- </xsl:text>
- <xsl:apply-templates/>
- <xsl:text>\end{quotation}
- </xsl:text>
- </xsl:template>
-
- <!-- XXX: We need to deal with table headers -->
-
- <xsl:template match="table">
- <xsl:variable name="table-type">
- <xsl:choose>
- <xsl:when test="count(tr) > 15">longtable</xsl:when>
- <xsl:otherwise>tabular</xsl:otherwise>
- </xsl:choose>
- </xsl:variable>
-
- <xsl:text>\begin{</xsl:text><xsl:value-of select="$table-type"/>
- <xsl:text>}{|</xsl:text>
- <xsl:choose>
- <xsl:when test="columnspec">
- <xsl:for-each select="columnspec/column">
- <xsl:text>l</xsl:text>
- <xsl:if test="../../@border and not(position()=last())">
- <xsl:text>|</xsl:text>
- </xsl:if>
- </xsl:for-each>
- </xsl:when>
- <xsl:otherwise>
- <xsl:for-each select="tr[1]/*">
- <xsl:text>l</xsl:text>
- <xsl:if test="../../@border and not(position()=last())">
- <xsl:text>|</xsl:text>
- </xsl:if>
- </xsl:for-each>
- </xsl:otherwise>
- </xsl:choose>
- <xsl:text>|}\hline
- </xsl:text>
- <xsl:apply-templates select="tr"/>
- <xsl:text>\hline\end{</xsl:text>
- <xsl:value-of select="$table-type"/>
- <xsl:text>}
- </xsl:text>
- </xsl:template>
-
- <xsl:template match="tr">
- <xsl:apply-templates select="td|th"/>
- <xsl:text>\\</xsl:text>
- <xsl:if test="../@border and not(position()=last())">
- <xsl:text>\hline</xsl:text>
- </xsl:if>
- <xsl:text>
- </xsl:text>
- </xsl:template>
-
- <xsl:template match="td">
- <xsl:variable name="pos" select="position()"/>
- <xsl:text>\begin{minipage}[t]{</xsl:text>
- <xsl:choose>
- <xsl:when test="../../columnspec">
- <xsl:value-of select="../../columnspec/column[$pos]/@width"/>
- </xsl:when>
- <xsl:otherwise>
- <xsl:value-of select=".95 div last()"/>
- </xsl:otherwise>
- </xsl:choose>
- <xsl:text>\textwidth}\small </xsl:text>
- <xsl:apply-templates/>
- <xsl:text>\end{minipage}</xsl:text>
- <xsl:if test="not(position()=last())">
- <xsl:text> & </xsl:text>
- </xsl:if>
- </xsl:template>
-
- <xsl:template match="th">
- <xsl:variable name="pos" select="position()"/>
- <xsl:text>\begin{minipage}[t]{</xsl:text>
- <xsl:choose>
- <xsl:when test="../../columnspec">
- <xsl:value-of select="../../columnspec/column[$pos]/@width"/>
- </xsl:when>
- <xsl:otherwise>
- <xsl:value-of select=".95 div last()"/>
- </xsl:otherwise>
- </xsl:choose>
- <xsl:text>\textwidth}\bfseries </xsl:text>
- <xsl:apply-templates/>
- <xsl:text>\end{minipage}</xsl:text>
- <xsl:if test="not(position()=last())">
- <xsl:text> & </xsl:text>
- </xsl:if>
- </xsl:template>
-
- <!--
- This is a horrible hack, but it seems to mostly work. It does a
- few things:
-
- 1. Transforms references starting in http:// to footnotes with the
- appropriate hyperref macro to make them clickable. (This needs
- to be expanded to deal with news: and needs to be adjusted to
- deal with "#", which is creating bad links at the moment.)
-
- 2. For intra-document references, constructs the appropriate absolute
- reference using a latex \pageref.
- This involves applying a simplified version of the
- general URL resolution rules to deal with ../. It only works for
- one level of subdirectory.
-
- 3. It is also necessary to deal with the fact that index pages
- get references as "/".
- -->
- <xsl:template match="a">
- <xsl:apply-templates/>
- <xsl:if test="@href">
- <xsl:variable name="relpath" select="document(/*/@metafile)/metafile/relpath" />
- <xsl:variable name="path" select="document(/*/@metafile)/metafile/path" />
- <xsl:variable name="fileref">
- <xsl:choose>
- <xsl:when test="contains(@href, '.html')">
- <xsl:value-of select="substring-before(@href, '.html')"/>
- </xsl:when>
- <xsl:otherwise>
- <xsl:value-of select="concat(@href, 'index')"/>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:variable>
- <xsl:choose>
-
- <xsl:when test="starts-with(@href, 'http:') or starts-with(@href, 'news:') or starts-with(@href, 'mailto:')">
- <xsl:if test="not(.=@href)">
- <xsl:text>\footnote{</xsl:text>
- <xsl:text>\href{</xsl:text>
- <xsl:call-template name="replace-string">
- <xsl:with-param name="text" select="@href"/>
- <xsl:with-param name="replace" select="'#'"/>
- <xsl:with-param name="with" select="'\#'"/>
- </xsl:call-template>
- <xsl:text>}{</xsl:text>
- <xsl:call-template name="ltescape">
- <xsl:with-param name="string" select="@href"/>
- </xsl:call-template>
- <xsl:text>}}</xsl:text>
- </xsl:if>
- </xsl:when>
- <xsl:when test="starts-with(@href, '#')">
- <!-- Don't do inter-section references -->
- </xsl:when>
- <xsl:otherwise>
- <xsl:text> (p.\ \pageref{</xsl:text>
- <xsl:call-template name="replace-string">
- <xsl:with-param name="replace" select="'#'"/>
- <xsl:with-param name="with" select="':'"/>
- <xsl:with-param name="text">
- <xsl:choose>
- <xsl:when test="$relpath='.'">
- <xsl:value-of select="concat('/',$fileref)"/>
- </xsl:when>
- <xsl:otherwise>
- <xsl:choose>
- <xsl:when test="starts-with($fileref,'..')">
- <xsl:value-of select="substring-after($fileref,'..')"/>
- </xsl:when>
- <xsl:otherwise>
- <xsl:value-of select="concat($path,$fileref)"/>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:with-param>
- </xsl:call-template>
- <xsl:text>}) </xsl:text>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:if>
- </xsl:template>
-
- <xsl:template match="img">
- <xsl:variable name="path" select="document(/*/@metafile)/metafile/path" />
- <xsl:text>\includegraphics{</xsl:text>
- <xsl:call-template name="replace-string">
- <xsl:with-param name="text" select="concat('.',$path,@src)"/>
- <xsl:with-param name="replace" select="'.gif'"/>
- <xsl:with-param name="with" select="''"/>
- </xsl:call-template>
- <xsl:text>}</xsl:text>
- </xsl:template>
-
- </xsl:stylesheet>
-